#include<stdio.h>
#include<stdlib.h>
#include"datadef.h"

#ifndef LIST_H_

#define LIST_H_

//链表初始化分配内存大小
#define LIST_INIT_SIZE 100

//链表扩容分配内存大小
#define LIST_INCREMENT 10

//链表基本元素定义
typedef int LElemType;

//链表本身定义
typedef struct{
	LElemType *elem;
	int length;
	int listsize;
} List;

//定义比较函数的函数原型
typedef BOOL (*Compare)(LElemType elem1,LElemType elem2);

//定义访问节点函数的函数原型
typedef BOOL (*Visit)(LElemType elem);

//初始化链表
Status InitList(List **listP);

//销毁链表，此后链表指针将无法被使用，亦即链表不复存在
Status DestoryList(List **list);

//清空链表，此后链表内容为空，但依然可以使用
Status ClearList(List *list);

//查看链表是否为空
BOOL ListEmpty(List *list);

//获得链表长度
int ListLength(List *list);

//获得链表中某个位置的元素
LElemType GetElem(List *list , int loc);

//获得某个元素在某个链表中的位置
int LocateElem(List *list , LElemType elemToCompare);

//获得某个节点之前的节点
LElemType PriorElem(List *list , LElemType elem);

//获得某个节点之后的节点
LElemType NextElem(List *list , LElemType elem);

//在指定链表中插入新节点
Status ListInsert(List *list , int loc , LElemType elem);

//在指定链表中删除指定位置的节点
LElemType ListDelete(List *list , int loc );

//按指定方式遍历链表并访问元素
BOOL ListTraverse(List *list , Visit visit);

//填充链表内容，非标准原子操作
Status FillList(List *list);

//打印链表内容，包括具体信息，非标准原子操作
Status PrintList(List *list);

//仅打印链表元素，非标准原子操作
Status PrintListElem(List *list);

//默认的比较函数
BOOL DefaultCompare(LElemType elem1 , LElemType elem2);

//默认的元素访问函数
BOOL DefaultVisit(LElemType elem);

#endif /* LIST_H_ */
